/**
 * 参数处理
 * @param {*} params  参数
 */
export function tansParams(params) {
  let result = ''
  for (const propName of Object.keys(params)) {
    const value = params[propName]
    var part = encodeURIComponent(propName) + '='
    if (value !== null && value !== '' && typeof value !== 'undefined') {
      if (typeof value === 'object') {
        for (const key of Object.keys(value)) {
          if (value[key] !== null && value[key] !== '' && typeof value[key] !== 'undefined') {
            let params = propName + '[' + key + ']'
            var subPart = encodeURIComponent(params) + '='
            result += subPart + encodeURIComponent(value[key]) + '&'
          }
        }
      } else {
        result += part + encodeURIComponent(value) + '&'
      }
    }
  }
  return result
}

/**
 * 深度克隆
 * @param { any } source
 */
export function deepClone(source) {
  if (source === null || typeof source !== 'object') {
    return source
  }
  const target = Array.isArray(source) ? [] : {}
  for (let key in source) {
    if (Object.prototype.hasOwnProperty.call(source, key)) {
      const value = source[key]
      if (value === null || typeof value !== 'object') {
        target[key] = value
      } else if (value instanceof Date) {
        target[key] = new Date(value.getTime())
      } else if (value instanceof RegExp) {
        const flags = /\w*$/.exec(value)[0]
        target[key] = new RegExp(value.source, flags)
      } else if (value instanceof Set) {
        target[key] = new Set([...value])
      } else if (value instanceof Map) {
        target[key] = new Map([...value])
      } else {
        target[key] = deepClone(value)
      }
    }
  }

  return target
}
